package com.czg.jsonschema2lombokpojo.annotator;

import com.czg.jsonschema2lombokpojo.config.GenerationConfig;
import com.fasterxml.jackson.databind.JsonNode;
import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;
import com.sun.codemodel.JDefinedClass;
import com.sun.codemodel.JEnumConstant;
import com.sun.codemodel.JFieldVar;

/**
 * 使用Gson注解生成的Java类型。
 * 当JSON字段包含不适合bean使用的字符（如下划线）时，这里使用的注解最有用。
 * 通过使用{@link SerializedName}注解，我们能够保留原始格式。
 * 与{@link GenerationConfig#getPropertyWordDelimiters}一起使用，过滤掉下划线或其他不需要的分隔符，但仍然对相同的内容进行封送/反封送。
 *
 * @see <a
 *      href="https://code.google.com/p/google-gson/">https://code.google.com/p/google-gson/</a>
 */
public class GsonAnnotator extends AbstractAnnotator {

    public GsonAnnotator(GenerationConfig generationConfig) {
        super(generationConfig);
    }

    @Override
    public void propertyField(JFieldVar field, JDefinedClass clazz, String propertyName, JsonNode propertyNode) {
        field.annotate(SerializedName.class).param("value", propertyName);
        field.annotate(Expose.class);
    }

    @Override
    public void enumConstant(JDefinedClass _enum, JEnumConstant constant, String value) {
        constant.annotate(SerializedName.class).param("value", value);
    }

    @Override
    public boolean isAdditionalPropertiesSupported() {
        return false;
    }

}
